class Student:

    def __init__(self, student_sid: str, student_name: str, student_age: int, student_gender: str):
        self.sid = student_sid
        self.name = student_name
        self.age = student_age
        self.gender = student_gender

    def __repr__(self):
        return f'学号:{self.sid},姓名：{self.name},年龄：{self.age},性别：{self.gender}'


class StudentManagement:
    def __init__(self, stu_list: list[Student]):
        if stu_list:
            self.stu_list = stu_list
        else:
            self.stu_list = []

    def add(self, student: Student):
        tmp = self.search_by_sid(student.sid)
        if tmp:
            print(f'--添加失败：学生{tmp}已存在')
        else:
            self.stu_list.append(student)
            print(f'--添加成功：成功添加学生 {student}')

    # 先获取指定学号学生的索引
    # 然后对指定学生进行编辑
    def edit(self, sid):
        index = 0
        for stu in self.stu_list:
            if sid == stu.sid:
                break
            else:
                index += 1

        if index == len(self.stu_list):
            print('--修改失败：该学生系统无该学号学生')
        else:
            try:
                print(f'--当前修改的学生为： {self.stu_list[index]}')
                name_tmp = input('--请输入该学生修改后的姓名：')
                age_tmp = int(input('--请输入该学生修改后的年纪【请输入整数】：'))
                gender_tmp = input('--请输入需要添加的学生性别：【男、女】')
                if gender_tmp != '男' and gender_tmp != '女':
                    print('--添加失败：添加的学生性别输入错误')
                else:
                    self.stu_list[index].name = name_tmp
                    self.stu_list[index].age = age_tmp
                    self.stu_list[index].gender = gender_tmp
                    print(f'--成功修改：学生信息成功修改为 {self.stu_list[index]}')
            except Exception:
                print('--修改失败：该学生信息修改失败')

    # 循环查询对应学号学生并删除；查找不到提示删除失败
    def delete_by_sid(self, sid):

        i = 0
        while i < len(self.stu_list):
            if sid == self.stu_list[i].sid:
                print(f"--成功删除学生{self.stu_list[i]}")
                del self.stu_list[i]
                break
            else:
                i += 1
        else:
            print('--删除失败：当前系统无该学号的学生')

    # 循环查询对应姓名学生并删除；查找不到提示删除失败
    def delete_by_name(self, name):

        flag = 0
        i = 0
        while i < len(self.stu_list):
            if name == self.stu_list[i].name:
                print(f"--成功删除学生 {self.stu_list[i]}")
                del self.stu_list[i]
                flag += 1
            else:
                i += 1
        if flag == 0:
            print('--删除失败：当前系统无该姓名的学生')

    # 循环查找对应学号学生并返回
    def search_by_sid(self, sid: str):
        for stu in self.stu_list:
            if stu.sid == sid:
                return stu

    # 循环查找对应姓名学生并返回
    def search_by_name(self, name: str):
        tmp_stu_list = []
        for stu in self.stu_list:
            if stu.name == name:
                tmp_stu_list.append(stu)
        return tmp_stu_list

    # 获取所有学生信息并展示
    def search_all(self):
        if self.stu_list:
            return self.stu_list
        else:
            print(f'--当前学生管理系统无任何学生')

    @staticmethod
    def menu():
        print("****************************************")
        print("*          学生管理系统               *")
        print("*          1. 添加新学生信息           *")
        print("*          2. 通过学号修改学生信息      *")
        print("*          3. 通过学号删除学生信息      *")
        print("*          4. 通过姓名删除学生信息      *")
        print("*          5. 通过学号查询学生信息      *")
        print("*          6. 通过姓名查询学生信息      *")
        print("*          7. 显示所有学生信息         *")
        print("*          8. 退出系统                *")
        print("****************************************")

    def load_data(self, file_name: str):
        with open(file_name, mode='r', encoding='utf-8') as file:
            for line in file.readlines():
                tmp = line.splitlines()[0].split(',')
                stu_tmp = Student(tmp[0], tmp[1], int(tmp[2]), tmp[3])
                self.add(stu_tmp)
            file.close()

    def write_data(self, file_name: str):
        with open(file_name, mode='w', encoding='utf-8') as file:
            for stu in self.stu_list:
                tmp_str = stu.sid + ',' + stu.name + ',' + str(stu.age) + ',' + stu.gender + '\n'
                file.write(tmp_str)
            file.close()

    def control(self, file_name: str):
        self.load_data(file_name)
        while True:
            self.menu()
            select_op = input("输入编号选择操作：")

            if select_op == '1':
                try:
                    sid_tmp_1 = input('--请输入需要添加的学生学号：')
                    name_tmp_1 = input('--请输入需要添加的学生姓名：')
                    age_tmp_1 = int(input('--请输入需要添加的学生年龄：'))
                    gender_tmp_1 = input('--请输入需要添加的学生性别：【男、女】')
                    if gender_tmp_1 != '男' and gender_tmp_1 != '女':
                        print('--添加失败：添加的学生性别输入错误')
                    else:
                        student_tmp1 = Student(sid_tmp_1, name_tmp_1, age_tmp_1, gender_tmp_1)
                        self.add(student_tmp1)
                        self.write_data(file_name)
                except Exception:
                    print('--学生信息添加失败')
            elif select_op == '2':
                if self.stu_list:
                    sid_tmp_2 = input('--请输入需要修改的学生学号：')
                    self.edit(sid_tmp_2)
                    self.write_data(file_name)
                else:
                    print('--修改失败：当前学生管理系统无任何学生')
            elif select_op == '3':
                if self.stu_list:
                    sid_tmp_3 = input('--请输入需要删除的学生学号：')
                    self.delete_by_sid(sid_tmp_3)
                    self.write_data(file_name)
                else:
                    print('--删除失败：当前学生管理系统无任何学生')
            elif select_op == '4':
                if self.stu_list:
                    name_tmp_4 = input('--请输入需要删除的学生姓名：')
                    self.delete_by_name(name_tmp_4)
                    self.write_data(file_name)
                else:
                    print('--删除失败：当前学生管理系统无任何学生')
            elif select_op == '5':
                if self.stu_list:
                    sid_tmp_5 = input('--请输入需要查询的学生编号：')
                    students_tmp5 = self.search_by_sid(sid_tmp_5)
                    if students_tmp5:
                        print(f"--成功查找学生{students_tmp5}")
                    else:
                        print(f'--在当前学生系统中，未找到学生编号为{sid_tmp_5}的学生')
                else:
                    print('--查询失败：当前学生管理系统无任何学生')
            elif select_op == '6':
                if self.stu_list:
                    name_tmp_6 = input('--请输入需要查询的学生姓名：')
                    students_tmp6 = self.search_by_name(name_tmp_6)
                    if students_tmp6:
                        for stu_tmp6 in students_tmp6:
                            print(f"--成功查找学生{stu_tmp6}")
                    else:
                        print(f'--在当前学生系统中，未找到学生姓名为{name_tmp_6}的学生')
                else:
                    print('--查询失败：当前学生管理系统无任何学生')
            elif select_op == '7':
                students_tmp7 = self.search_all()
                for stu_tmp7 in students_tmp7:
                    print(stu_tmp7)
            elif select_op == '8':
                self.write_data(file_name)
                break
            else:
                print('请输入正确的编号值')


if __name__ == '__main__':
    stu_list1 = StudentManagement([])
    stu_list1.control('students_management.txt')
